package com.jintian.smart.kernel.common.expr.datameta;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 表达式上下文变量
 */
public class Variable extends BaseDataMeta {

	// 变量名
	String variableName;

	/**
	 * 根据别名和参数值，构造 Variable 实例
	 * 
	 * @param variableName
	 * @param variableValue
	 * @return Variable
	 */
	public static Variable createVariable(String variableName, Object variableValue) {
		return new Variable(variableName, getVariableDataType(variableValue), variableValue);
	}

	public static DataType getVariableDataType(Object variableValue) {
		if (variableValue instanceof Boolean) {
			return DataType.DATATYPE_BOOLEAN;

		} else if (variableValue instanceof Date) {
			return DataType.DATATYPE_DATE;

		} else if (variableValue instanceof BigDecimal) {
			return DataType.DATATYPE_BIGDECIMAL;
		} else if (variableValue instanceof Double) {
			return DataType.DATATYPE_DOUBLE;

		} else if (variableValue instanceof Float) {
			return DataType.DATATYPE_FLOAT;

		} else if (variableValue instanceof Integer) {
			return DataType.DATATYPE_INT;

		} else if (variableValue instanceof Long) {
			return DataType.DATATYPE_LONG;

		} else if (variableValue instanceof String) {
			return DataType.DATATYPE_STRING;

		} else if (variableValue instanceof List) {
			return DataType.DATATYPE_LIST;

		} else if (variableValue instanceof Map) {
			return DataType.DATATYPE_MAP;
		} else {
			return DataType.DATATYPE_OBJECT;
		}
		// else if (variableValue instanceof Object) {
		// return DataType.DATATYPE_OBJECT;
		//
		// } else if (variableValue == null) {
		// return DataType.DATATYPE_OBJECT;
		//
		// } else {
		// throw new IllegalArgumentException("非法参数：无法识别的变量类型");
		// }
	}

	public Variable(String variableName) {
		this(variableName, null, null);
	}

	public Variable(String variableName, DataType variableDataType, Object variableValue) {
		super(variableDataType, variableValue);

		if (variableName == null) {
			throw new IllegalArgumentException("非法参数：变量名为空");
		}

		this.variableName = variableName;
	}

	public String getVariableName() {
		return variableName;
	}

	public Variable setVariableValue(Object variableValue) {
		this.dataValue = variableValue;
		if (variableValue != null && DataType.DATATYPE_OBJECT.equals(this.dataType)) {
			this.dataType = Variable.getVariableDataType(variableValue);
		}
		// 参数类型校验
		verifyDataMeta();
		return this;
	}

	public Variable setDataType(DataType dataType) {
		this.dataType = dataType;
		// 参数类型校验
		verifyDataMeta();
		return this;
	}

	@Override
	public boolean equals(Object o) {
		if (o == this) {
			return true;

		} else if (o instanceof Variable && super.equals(o)) {

			Variable var = (Variable) o;
			if (variableName != null && variableName.equals(var.variableName)) {
				return true;
			} else {
				return false;
			}

		} else {
			return false;
		}
	}

}
